3
תגובות
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '127.0.0.1', 100);
socket_listen($socket);
$client = socket_accept($socket);
socket_write($client, 'output');
sleep(10);
socket_close($client);
socket_close($socket);
?>
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '127.0.0.1', 100);
socket_listen($socket);
$client = socket_accept($socket);
socket_write($client, 'output');
sleep(10);
socket_close($client);
socket_close($socket);
?>
כשאני כותב בטרמינל "nc localhost 100" (יש לי גישת root כמובן), אני מקבל "output" ישירות.
לעומת זאת, אם אני נכנס בדפדפן ל-"localhost:100", אני מקבל "output" רק אחרי 10 שניות.
אבל, אם אני משנה את הקוד:
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '127.0.0.1', 100);
socket_listen($socket);
$client = socket_accept($socket);
$str = '';
for ($index = 0; $index < 4096; $index++) {
$str .= ' ';
}
socket_write($client, $str);
socket_write($client, 'output');
sleep(10);
socket_close($client);
socket_close($socket);
?>
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '127.0.0.1', 100);
socket_listen($socket);
$client = socket_accept($socket);
$str = '';
for ($index = 0; $index < 4096; $index++) {
$str .= ' ';
}
socket_write($client, $str);
socket_write($client, 'output');
sleep(10);
socket_close($client);
socket_close($socket);
?>
אני מקבל "output" ישירות בדפדפן (עם כל הרווחים לפני).
למה זה קורה? ואיך אני יכול לגרום לדפדפן להציג את הטקסט שהוא מקבל ישירות, בלי לשלוח המון רווחים?
3 תשובות
ענה
iiddaannyy
ב
22 לאוגוסט 2012
#
אוקיי, זה בגלל הדפדפן: http://stackoverflow.com/questions/12065076/browser-doesnt-show-received-socket-data-immediately
אתה חייב לסגור את החיבור כדי שהוא יגמור לקבל את המידע. כי עד שהוא לא גומר לקבל הוא לא מציג.
אבל אם אתה שולח הרבה מידע כמו עם הרווחים אז הוא כבר מציג.
תכתוב ככה.
socket_close($client);
sleep(10);
socket_close($socket);
sleep(10);
socket_close($socket);
אני לא מבין בשביל מה אתה צריך את הsleep הזה. כי עושה את הבעיה.
ענה
iiddaannyy
ב
23 לאוגוסט 2012
#
ה-sleep הוא רק להדגמה.
אני צריך חיבור פתוח להרבה זמן שעוברות בו הרבה הודעות. וחשוב שכל הודעה תוצג ישירות בדפדפן.
הדפדפן מתעלם מכמות מידע מסוימת, לכן צריך לשלוח סתם מידע לפני זה.